package com.ycyoes.test.hollis.datastructure;

/**
 * 一般情况下，数组是不能实现队列的，因为先进先出，可能会存在假溢出的情况，所以数组的空间一定会被浪费。
 * 所以，我们会通过循环的方式，当最尾部的索引到达length之后，我们会将该索引重新置为0，以此来重复利用数组的空间。
 * 而这样一种形式，就会造成一种逻辑循环，也就是我们说的循环队
 *
 * 一般来说，循环队列可以作为缓冲区使用，如果index超出，直接覆盖就可以了。
 */
class QueueByArray {
    private final int[] items;
    private int head=0;
    private int tail=0;

    public boolean push(int data) {
        if(((tail + 1) % items.length) == head) {
            // 此时说明队列的空间已经满了，只能扩容
            return false;
        }
        else {
            items[tail] = data;
            tail = (tail+1) % items.length;
            return true;
        }
    }
    public int pop() {
        int data = items[head];
        head = (head+1) % items.length;
        return data;
    }
    public QueueByArray(int length) {
        this.items = new int[length];
    }
}
